home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / exampleCode / opengl / GLUT / progs / contrib / lineblend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-11  |  6.7 KB  |  254 lines

  1.  
  2. /* lineblend.c
  3.  * 
  4.  * To compile: cc -o lineblend lineblend.c -lGL -lGLU -lX11 -lglut -lXmu
  5.  *
  6.  * Usage: lineblend
  7.  *
  8.  * This is an puffed up version of the first GL assignment we had for my
  9.  * graphics class: write a 2-d openGL program w/ color and interactivity.
  10.  *
  11.  * Left and middle buttons drawn colored lines, right button brings up a menu
  12.  * with a few options.  If you draw for long enough and then hit pick
  13.  * "redraw" (or resize or uncover the window) it takes so long to redraw
  14.  * all the lines it is kind of like a kaleidoscope animation. Or something.
  15.  *
  16.  * Philip Winston - 2/11/95  (modified: 2/12)
  17.  * pwinston@hmc.edu
  18.  * http://www.cs.hmc.edu/people/pwinston
  19.  *        
  20.  */
  21.  
  22. #include <GL/glut.h>
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26.  
  27. typedef enum {MENU_ALPHA_1, MENU_ALPHA_2,  MENU_ALPHA_3, MENU_ALPHA_4,
  28.               MENU_COLOR_1, MENU_COLOR_2,  MENU_COLOR_3, MENU_COLOR_4,
  29.               MENU_ANTI_ON, MENU_ANTI_OFF,
  30.               MENU_ERASE,   MENU_REDRAW,   MENU_QUIT} MenuChoices;
  31.  
  32. typedef enum {SC1, SC2, SC3, SC4} ColorScheme;
  33.  
  34. int wwidth, wheight, downbtn = -1, downx, downy;
  35.  
  36. GLuint DispLists = 1;
  37.  
  38. GLfloat Alpha = 0.2;
  39. int Color = SC1;
  40.  
  41. void myglInit(void)
  42. {
  43.   glLineWidth(10.0);
  44.   glEnable(GL_BLEND);
  45.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  46.  
  47.   glMatrixMode(GL_PROJECTION);
  48.   glLoadIdentity();
  49.   gluOrtho2D(-0.5,0.5,-0.5,0.5);
  50.  
  51.   glMatrixMode(GL_MODELVIEW);
  52.   glLoadIdentity();
  53.  
  54.   glFlush();
  55.  
  56. void myreshape(GLsizei w, GLsizei h)
  57. {
  58.   wwidth = w; wheight = h;
  59.   glViewport(0,0,w,h);
  60.   glClear(GL_COLOR_BUFFER_BIT);
  61.   glFlush();
  62. }
  63.  
  64. void mydisplay(void)
  65. {
  66.   GLuint i;
  67.  
  68.   glClear(GL_COLOR_BUFFER_BIT);
  69.  
  70.   for (i = 0; i < DispLists; i++)
  71.     glCallList(i);
  72.  
  73.   glFlush();
  74. }
  75.  
  76. void drawline(int x, int y)
  77. {
  78.   GLfloat fx =   (float)(x - downx)/wwidth,
  79.           fy = -((float)(y - downy)/wheight),
  80.           r1, g1, b1, r2, g2, b2;
  81.  
  82.   switch(Color) {      /* four different ways to pick colors */
  83.     case SC1:          /* just kind of random formulas...    */
  84.       r1 = fy+1; g1 = 0;    b1 = (float)x/wwidth;
  85.       r2 = 0;    g2 = fy+1; b2 = 1-(float)x/wwidth;
  86.       break;
  87.     case SC2:
  88.       r1 = fx+fy+1; g1 = 0;       b1 = 0;
  89.       r2 = 0;       g2 = fx+fy+1; b2 = 0;
  90.       break;
  91.     case SC3:
  92.       r1 = 0;   g1 = (float)downx/wwidth; b1 = (float)x/wwidth;
  93.       r2 = 0;   g2 = (float)y/wheight; b2 = (float)downy/wheight;
  94.       break;
  95.     case SC4:
  96.       r1 = drand48(); g1 = drand48(); b1 = (float)downx/(wwidth*1.5);
  97.       r2 = drand48(); g2 = (float)downy/(wheight*1.5); b2 = drand48();
  98.       break;
  99.   }
  100.  
  101.  
  102.   glBegin(GL_LINES);
  103.         glColor4f(r1, g1, b1, Alpha);
  104.     switch(downbtn) {
  105.       case GLUT_LEFT_BUTTON:   glVertex2f(0,0);     break;        
  106.       case GLUT_MIDDLE_BUTTON: glVertex2f(-fx,-fy); break;
  107.       }
  108.     glColor4f(r2, g2, b2, Alpha); glVertex2f(fx,fy);
  109.   glEnd();
  110.  
  111.   glFlush();
  112. }
  113.  
  114. void mousebutton(int btn, int state, int x, int y)
  115. {
  116.   GLfloat fx =  (float)x/wwidth - 0.5,
  117.           fy = -(float)y/wheight + 0.5;
  118.  
  119.   if (state == GLUT_DOWN && downbtn == -1) {
  120.     glNewList(DispLists++, GL_COMPILE_AND_EXECUTE);
  121.     glPushMatrix();
  122.     glTranslatef(fx, fy, 0);
  123.     downbtn = btn;
  124.     downx = x;
  125.     downy = y;
  126.     drawline(x, y);
  127.   } else if (state == GLUT_UP && btn == downbtn) {
  128.     glPopMatrix();
  129.     glEndList();
  130.     downbtn = -1;
  131.   }
  132. }
  133.  
  134. /*
  135.  * For some reason I felt like doing these check boxes -- it is kind of
  136.  * lame the way I did it, though.  Probably a smarter and easier way.
  137.  */
  138.  
  139. void handlealphamenu(int value)
  140. {
  141.   glutChangeToMenuEntry(1,"[   ] 0.05", MENU_ALPHA_1);  
  142.   glutChangeToMenuEntry(2,"[   ] 0.20", MENU_ALPHA_2);
  143.   glutChangeToMenuEntry(3,"[   ] 0.50", MENU_ALPHA_3);
  144.   glutChangeToMenuEntry(4,"[   ] 1.00", MENU_ALPHA_4);
  145.   switch (value) {
  146.     case MENU_ALPHA_1:
  147.       glutChangeToMenuEntry(1, "[ * ] 0.05", MENU_ALPHA_1);  
  148.       Alpha = 0.05; break;
  149.     case MENU_ALPHA_2:
  150.       glutChangeToMenuEntry(2, "[ * ] 0.20", MENU_ALPHA_2);
  151.       Alpha = 0.2; break;
  152.     case MENU_ALPHA_3:
  153.       glutChangeToMenuEntry(3, "[ * ] 0.50", MENU_ALPHA_3);
  154.       Alpha = 0.5; break;
  155.     case MENU_ALPHA_4:
  156.       glutChangeToMenuEntry(4, "[ * ] 1.00", MENU_ALPHA_4);
  157.       Alpha = 1.0; break;
  158.     }
  159. }
  160.  
  161. void handlecolormenu(int value)
  162. {
  163.   glutChangeToMenuEntry(1,"[   ] Various", MENU_COLOR_1);  
  164.   glutChangeToMenuEntry(2,"[   ] Red/Green  ", MENU_COLOR_2);
  165.   glutChangeToMenuEntry(3,"[   ] Blue/Green", MENU_COLOR_3);
  166.   glutChangeToMenuEntry(4,"[   ] Random", MENU_COLOR_4);
  167.   switch (value) {
  168.     case MENU_COLOR_1:
  169.       glutChangeToMenuEntry(1, "[ * ] Various", MENU_COLOR_1);  
  170.       Color = SC1; break;
  171.     case MENU_COLOR_2:
  172.       glutChangeToMenuEntry(2, "[ * ] Red/Green", MENU_COLOR_2);
  173.       Color = SC2; break;
  174.     case MENU_COLOR_3:
  175.       glutChangeToMenuEntry(3, "[ * ] Blue/Green", MENU_COLOR_3);
  176.       Color = SC3; break;
  177.     case MENU_COLOR_4:
  178.       glutChangeToMenuEntry(4, "[ * ] Random", MENU_COLOR_4);
  179.       Color = SC4; break;
  180.     }
  181. }
  182.  
  183. void handlemenu(int value)
  184. {
  185.   switch (value) {
  186.     case MENU_ANTI_OFF:
  187.       glDisable(GL_LINE_SMOOTH);
  188.       glutChangeToMenuEntry(3, "anti-aliasing [NO]", MENU_ANTI_ON);
  189.       break;
  190.     case MENU_ANTI_ON:
  191.       glEnable(GL_LINE_SMOOTH);
  192.       glutChangeToMenuEntry(3, "anti-aliasing [YES]", MENU_ANTI_OFF);
  193.       break;
  194.     case MENU_REDRAW:
  195.       glutPostRedisplay();
  196.       break;
  197.     case MENU_ERASE:
  198.       glDeleteLists(0, DispLists);
  199.       DispLists = 1;
  200.       mydisplay();
  201.       break;
  202.     case MENU_QUIT:
  203.       exit(0);
  204.       break;
  205.     }
  206. }
  207.  
  208. void myMenuInit(void)
  209. {
  210.   int sub1,sub2,sub3;
  211.  
  212.   sub3 = glutCreateMenu(handlealphamenu);
  213.   glutAddMenuEntry("[   ] 0.05", MENU_ALPHA_1);  
  214.   glutAddMenuEntry("[ * ] 0.20", MENU_ALPHA_2);
  215.   glutAddMenuEntry("[   ] 0.50", MENU_ALPHA_3);
  216.   glutAddMenuEntry("[   ] 1.00", MENU_ALPHA_4);
  217.   sub2 = glutCreateMenu(handlecolormenu);
  218.   glutAddMenuEntry("[ * ] Various", MENU_COLOR_1);  
  219.   glutAddMenuEntry("[   ] Red/Green", MENU_COLOR_2);
  220.   glutAddMenuEntry("[   ] Blue/Green", MENU_COLOR_3);
  221.   glutAddMenuEntry("[   ] Random", MENU_COLOR_4);
  222.   sub1 = glutCreateMenu(handlemenu);
  223.   glutAddSubMenu("Colors", sub2);
  224.   glutAddSubMenu("Alpha", sub3);
  225.   glutAddMenuEntry("anti-aliasing [NO]", MENU_ANTI_ON);
  226.   glutCreateMenu(handlemenu);
  227.   glutAddSubMenu("Lines", sub1);
  228.   glutAddMenuEntry("Erase", MENU_ERASE);
  229.   glutAddMenuEntry("Redraw", MENU_REDRAW);
  230.   glutAddMenuEntry("Quit", MENU_QUIT);
  231.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  232. }
  233.  
  234. int main(int argc, char** argv)
  235. {
  236.   glutInit(&argc, argv);
  237.   glutInitWindowSize(512, 512);
  238.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  239.   glutCreateWindow("lineblend");
  240.  
  241.   myglInit(); 
  242.   myMenuInit();
  243.  
  244.   glutReshapeFunc(myreshape);
  245.   glutMouseFunc(mousebutton);
  246.   glutMotionFunc(drawline);
  247.   glutDisplayFunc(mydisplay);
  248.  
  249.   glutMainLoop();
  250.   return 0;             /* ANSI C requires main to return int. */
  251. }
  252.  
  253.